#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include "list.h"

List* list = NULL;

typedef struct Student
{
	size_t id;
	char name[20];
	float score;
}Student;

void show_stu(void);
void show_i(int index);

void add_stu(void)
{
	Student* stu = malloc(sizeof(Student));
	printf("请输入学生的学号、改名、成绩：");
	scanf("%u %s %f",&stu->id,stu->name,&stu->score);
	add_tail_list(list,stu);
}

void del_stu(void)
{
	printf("请选择按姓名删除(n)，还是学号i删除(i)：");
	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
	if('n' == getch())
	{
		char name[20] = {};
		printf("请输入要删除和姓名：");
		gets(name);
		int cmp(const void* ptr1,const void* ptr2)
		{
			const Student* stu = ptr1;
			const char* name = ptr2;
			return strcmp(stu->name,name);	
		}
		printf("删除%s\n",del_value_list(list,name,cmp)?"成功":"失败");
	}
	else
	{
		size_t id = 0;
		printf("请输入要删除的学号：");
		scanf("%u",&id);
		int cmp(const void* ptr1,const void* ptr2)
		{
			const Student* stu = ptr1;
			const size_t* id = ptr2;
			if(stu->id > *id)
				return 1;
			else if(stu->id < *id)
				return -1;
			else 
				return 0;
		}
		printf("删除%s\n",del_value_list(list,&id,cmp)?"成功":"失败");
	}
}

void find_stu(void)
{
	printf("请选择按姓名查询(n)，还是学号i查询(i)：");
	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
	if('n' == getch())
	{
		char name[20] = {};
		printf("请输入要查询的姓名：");
		gets(name);
		int cmp(const void* ptr1,const void* ptr2)
		{
			const Student* stu = ptr1;
			const char* name = ptr2;
			return strcmp(stu->name,name);	
		}
		int index = find_list(list,name,cmp);
		if(index!=-1)
		{
			show_i(index);
		}
		else
		{
			printf("没有此学生\n");
		}
	}
	else
	{
		size_t id = 0;
		printf("请输入要查询的学号：");
		scanf("%u",&id);
		int cmp(const void* ptr1,const void* ptr2)
		{
			const Student* stu = ptr1;
			const size_t* id = ptr2;
			if(stu->id > *id)
				return 1;
			else if(stu->id < *id)
				return -1;
			else 
				return 0;
		}
		int index = find_list(list,&id,cmp);
		if(index!=-1)
		{
			show_i(index);
		}
		else
		{
			printf("没有此学生\n");
		}
	}
}

void modify_stu(void)
{
	printf("请输入学号：");
	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
	size_t id = 0;
	scanf("%u",&id);
	int cmp(const void* ptr1,const void* ptr2)
	{
		const Student* stu = ptr1;
		const size_t* id = ptr2;
		if(stu->id > *id)
			return 1;
		else if(stu->id < *id)
			return -1;
		else 
			return 0;
	}
	int index = find_list(list,&id,cmp);
	if(index!=-1)
	{
		Student* stu = malloc(sizeof(Student));
		printf("请输入学生的学号、改名、成绩：");
		scanf("%u %s %f",&stu->id,stu->name,&stu->score);
		del_index_list(list,index);
		insert_list(list,index,stu);
	}
	else
	{
		printf("没有此学生\n");
	}
}

void show_stu(void)
{
	void show(const void* ptr)
	{
		const Student* stu = ptr;
		printf("%u %s %g\n",stu->id,stu->name,stu->score);
	}
	show_list(list,show);
}

void show_i(int index)
{
	void show(const void* ptr)
	{
		const Student* stu = ptr;
		printf("%u %s %g\n",stu->id,stu->name,stu->score);
	}
	show_index(list,index,show);
}

int main()
{
	list = creat_list();
	add_stu();
	add_stu();
	add_stu();
	del_stu();
	show_stu();
	find_stu();
	modify_stu();
	show_stu();
	destory_list(list);
	
}
